home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Mac / Demo / sound / morselib.py < prev    next >
Text File  |  1995-03-10  |  3KB  |  189 lines

  1. """Translate text strings to Morse code"""
  2.  
  3. FRAMERATE = 22050
  4. SAMPWIDTH = 2
  5.  
  6. BASEFREQ = 441
  7. OCTAVE = 2
  8.  
  9. DOT = 30
  10. DAH = 80
  11.  
  12. morsetab = {
  13.     'a': '.-',
  14.     'b': '-...',
  15.     'c': '-.-.',
  16.     'd': '-..',
  17.     'e': '.',
  18.     'f': '..-.',
  19.     'g': '--.',
  20.     'h': '....',
  21.     'i': '..',
  22.     'j': '.---',
  23.     'k': '-.-',
  24.     'l': '.-..',
  25.     'm': '--',
  26.     'n': '-.',
  27.     'o': '---',
  28.     'p': '.--.',
  29.     'q': '--.-',
  30.     'r': '.-.',
  31.     's': '...',
  32.     't': '-',
  33.     'u': '..-',
  34.     'v': '...-',
  35.     'w': '.--',
  36.     'x': '-..-',
  37.     'y': '-.--',
  38.     'z': '--..',
  39.     '0': '-----',
  40.     '1': '.----',
  41.     '2': '..---',
  42.     '3': '...--',
  43.     '4': '....-',
  44.     '5': '.....',
  45.     '6': '-....',
  46.     '7': '--...',
  47.     '8': '---..',
  48.     '9': '----.',
  49.     ',': '--..--',
  50.     '.': '.-.-.-',
  51.     '?': '..--..',
  52.     ';': '-.-.-.',
  53.     ':': '---...',
  54.     "'": '.----.',
  55.     '-': '-....-',
  56.     '/': '-..-.',
  57.     '(': '-.--.-',
  58.     ')': '-.--.-', # XXX same as code for '(' ???
  59.     '_': '..--.-',
  60.     ' ': ' '
  61. }
  62.  
  63. def morsecode(s):
  64.     from string import lower
  65.     m = ''
  66.     for c in s:
  67.         c = lower(c)
  68.         if morsetab.has_key(c):
  69.             c = morsetab[c] + ' '
  70.         else:
  71.             c = '? '
  72.         m = m + c
  73.     return m
  74.  
  75.  
  76. class BaseMorse:
  77.     "base class for morse transmissions" 
  78.     
  79.     def __init__(self):
  80.         "constructor"
  81.         self.dots = DOT
  82.         self.dahs = DAH
  83.     
  84.     def noise(self, duration):
  85.         "beep for given duration"
  86.         pass
  87.     
  88.     def pause(self, duration):
  89.         "pause for given duration"
  90.         pass
  91.     
  92.     def dot(self):
  93.         "short beep"
  94.         self.noise(self.dots)
  95.     
  96.     def dah(self):
  97.         "long beep"
  98.         self.noise(self.dahs)
  99.     
  100.     def pdot(self):
  101.         "pause as long as a dot"
  102.         self.pause(self.dots)
  103.     
  104.     def pdah(self):
  105.         "pause as long as a dah"
  106.         self.pause(self.dahs)
  107.     
  108.     def sendmorse(self, s):
  109.         for c in s:
  110.             if c == '.': self.dot()
  111.             elif c == '-': self.dah()
  112.             else: self.pdah()
  113.             self.pdot()
  114.     
  115.     def sendascii(self, s):
  116.         self.sendmorse(morsecode(s))
  117.     
  118.     def send(self, s):
  119.         self.sendascii(s)
  120.  
  121.  
  122. import Audio_mac
  123. class MyAudio(Audio_mac.Play_Audio_mac):
  124.     def _callback(self, *args):
  125.         if hasattr(self, 'usercallback'): self.usercallback()
  126.         apply(Audio_mac.Play_Audio_mac._callback, (self,) + args)
  127.  
  128.  
  129. class MacMorse(BaseMorse):
  130.     "Mac specific class to play Morse code"
  131.     
  132.     def __init__(self):
  133.         BaseMorse.__init__(self)
  134.         self.dev = MyAudio()
  135.         self.dev.setoutrate(FRAMERATE)
  136.         self.dev.setsampwidth(SAMPWIDTH)
  137.         self.dev.setnchannels(1)
  138.         self.dev.usercallback = self.usercallback
  139.         sinewave = ''
  140.         n = int(FRAMERATE / BASEFREQ)
  141.         octave = OCTAVE
  142.         from math import sin, pi
  143.         for i in range(n):
  144.             val = int(sin(2 * pi * i * octave / n) * 0x7fff)
  145.             sample = chr((val >> 8) & 255) + chr(val & 255)
  146.             sinewave = sinewave + sample[:SAMPWIDTH]
  147.         self.sinewave = sinewave
  148.         self.silence = '\0' * (n*SAMPWIDTH)
  149.         self.morsequeue = ''
  150.     
  151.     def __del__(self):
  152.         self.close()
  153.     
  154.     def close(self):
  155.         self.dev = None
  156.     
  157.     def pause(self, duration):
  158.         self.dev.writeframes(self.silence * duration)
  159.     
  160.     def noise(self, duration):
  161.         self.dev.writeframes(self.sinewave * duration)
  162.     
  163.     def sendmorse(self, s):
  164.         self.morsequeue = self.morsequeue + s
  165.         self.dev.usercallback()
  166.         self.dev.usercallback()
  167.         self.dev.usercallback()
  168.     
  169.     def usercallback(self):
  170.         if self.morsequeue:
  171.             c, self.morsequeue = self.morsequeue[0], self.morsequeue[1:]
  172.             if c == '.': self.dot()
  173.             elif c == '-': self.dah()
  174.             else: self.pdah()
  175.             self.pdot()
  176.  
  177.  
  178. def test():
  179.     m = MacMorse()
  180.     while 1:
  181.         try:
  182.             line = raw_input('Morse line: ')
  183.         except (EOFError, KeyboardInterrupt):
  184.             break
  185.         m.send(line)
  186.         while m.morsequeue: pass
  187.  
  188. test()
  189.